# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
-# This is a script that can convert libglade files to the new gtkbuilder format
-#
# TODO:
# GtkComboBox.items -> GtkListStore
# GtkTextView.text -> GtkTextBuffer
# Toolbars
+"""Usage: gtk-builder-convert [OPTION] [INPUT] [OUTPUT]
+Converts Glade files into XML files which can be loaded with GtkBuilder.
+The [INPUT] file is
+
+ -w, --skip-windows Convert everything bug GtkWindow subclasses.
+ -h, --help display this help and exit
+
+When OUTPUT is -, write to standard input.
+
+Examples:
+ gtk-builder-convert preference.glade preferences.ui
+
+Report bugs to http://bugzilla.gnome.org/."""
+
+import getopt
import os
import sys
from xml.dom import minidom, Node
+WINDOWS = ['GtkWindow',
+ 'GtkDialog',
+ 'GtkFileChooserDialog',
+ 'GtkMessageDialog']
+
# The subprocess is only available in Python 2.4+
try:
import subprocess
class GtkBuilderConverter(object):
+ def __init__(self, skip_windows):
+ self.skip_windows = skip_windows
+
#
# Public API
#
uimgr.setAttribute('id', 'uimanager1')
self._interface.childNodes.insert(0, uimgr)
self._convert_menubar(uimgr, node)
+ elif klass in WINDOWS and self.skip_windows:
+ self._remove_window(node)
self._default_widget_converter(node)
elif prop_name == "tooltip" and klass != "GtkAction":
prop.setAttribute("name", "tooltip-text")
elif prop_name in ["response_id", 'response-id']:
+ # It does not make sense to convert responses when
+ # we're not going to output dialogs
+ if self.skip_windows:
+ continue
object_id = node.getAttribute('id')
response = prop.childNodes[0].data
self._convert_dialog_response(node, object_id, response)
prop.parentNode.removeChild(prop)
+ def _remove_window(self, node):
+ object_node = get_object_node(get_child_nodes(node)[0])
+ parent = node.parentNode
+ parent.removeChild(node)
+ parent.appendChild(object_node)
+
def _convert_menubar(self, uimgr, node):
menubar = self._dom.createElement('menubar')
menubar.setAttribute('name', node.getAttribute('id'))
s.stdin.close()
return s.stdout.read()
+def usage():
+ print __doc__
+
+def main(args):
+ try:
+ opts, args = getopt.getopt(args[1:], "hw",
+ ["help", "skip-windows"])
+ except getopt.GetoptError:
+ usage()
+ return 2
+
+ if len(args) != 2:
+ usage()
+ return 2
+
+ input_filename, output_filename = args
+
+ skip_windows = False
+ split = False
+ for o, a in opts:
+ if o in ("-h", "--help"):
+ usage()
+ sys.exit()
+ elif o in ("-w", "--skip-windows"):
+ skip_windows = True
+
+ conv = GtkBuilderConverter(skip_windows=skip_windows)
+ conv.parse_file(input_filename)
+
+ xml = _indent(conv.to_xml())
+ if output_filename == "-":
+ print xml
+ else:
+ open(output_filename, 'w').write(xml)
+ print "Wrote", output_filename
-def main():
- if len(sys.argv) < 2:
- raise SystemExit("Usage: %s filename.glade" % (sys.argv[0],))
-
- conv = GtkBuilderConverter()
- conv.parse_file(sys.argv[1])
-
- xml = conv.to_xml()
- print _indent(xml)
+ return 0
if __name__ == "__main__":
- main()
+ sys.exit(main(sys.argv))